package com.cqs.learning.spring.cloud.producer.azkaban;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
//import com.rong360.dataplatform.dto.ResultMessage;
import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

/**
 * @author lixiaowen
 * @date 2020/8/3
 */
@Slf4j
@Component
public class AzkabanApi {


//    @Value("skynet.azkaban.uri")
//    private String baseUrl = "http://10.12.26.90:8081";
//    private String managerUrl = String.format("%s/manager", baseUrl);
//    private String executorUrl = String.format("%s/executor", baseUrl);
//    @Value("skynet.azkaban.username")
//    private String userName = "azkaban";
//    @Value("skynet.azkaban.password")
//    private String password = "azkaban";
//
//    private static RestTemplate restTemplate = new RestTemplate();
//
//    /**
//     * 登录接口
//     *
//     * @return
//     */
//    public ResultMessage login() {
//        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
//        map.add("username", userName);
//        map.add("password", password);
//        map.add("action", "login");
//        ResponseEntity<JSONObject> forEntity = restTemplate.postForEntity(managerUrl, map, JSONObject.class);
//        JSONObject body = forEntity.getBody();
//        String sessionId = body.getString("session.id");
//        if (StringUtils.isEmpty(sessionId)) {
//            //{"error":"Incorrect Login. Username/Password not found."}
//            String msg = body == null ? "" : body.toString();
//            return ResultMessage.fail(msg);
//        }
//        ResultMessage message = new ResultMessage();
//        message.setData(sessionId);
//        return message;
//    }
//
//    /**
//     * 获取Azkaban的session.id
//     *
//     * @return
//     */
//    public String getAzkabanSessionId() {
//        ResultMessage login = login();
//        if (login.getError() == 0 && login.getData() != null) {
//            String s = login.getData().toString();
//            log.info("session:{}", s);
//            return s;
//        }
//        return null;
//    }
//
//
//    /**
//     * 创建project
//     *
//     * @param projectName
//     * @param desc
//     * @return
//     */
//    public boolean createProject(String projectName, String desc) {
//        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
//        map.add("session.id", getAzkabanSessionId());
//        map.add("name", projectName);
//        map.add("description", desc);
//        //使用JSONObject.class会报错
//        ResponseEntity<String> forEntity = restTemplate.postForEntity(managerUrl + "?action=create", map, String.class);
//        log.info("response body:{}", forEntity.getBody());
//        JSONObject jsonObject = JSON.parseObject(forEntity.getBody());
//        return StringUtils.equals(jsonObject.getString("status"), "success");
//    }
//
//
//    /**
//     * 删除工程接口
//     * <p>
//     * 不会返回格式化的数据
//     *
//     * @param projectName
//     * @return
//     */
//    public void deleteProject(String projectName) {
//        HttpHeaders headers = new HttpHeaders();
//        //  封装参数，千万不要替换为Map与HashMap，否则参数无法传递
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(managerUrl)
//                .queryParam("session.id", getAzkabanSessionId())
//                .queryParam("project", projectName)
//                .queryParam("delete", "true");
//        HttpEntity<?> entity = new HttpEntity<>(headers);
//        String uri = builder.toUriString();
//        restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
//        //log.info("response body:{}", forEntity.getBody());
//        //return StringUtils.equals(forEntity.getBody().getString("status"), "success");
//    }
//
//
//    /**
//     * Response Object
//     * Parameter	Description
//     * error	The error message if the upload attempt fails.
//     * projectId	The numerical id of the project
//     * version	The version number of the upload
//     *
//     * @param projectName
//     * @param filePath
//     * @return
//     */
//    public boolean uploadProject(String projectName, String filePath) {
//        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
//        map.add("session.id", getAzkabanSessionId());
//        map.add("project", projectName);
//        map.add("ajax", "upload");
//        map.add("file", new FileSystemResource(filePath));
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
//        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);
//        ResponseEntity<JSONObject> forEntity = restTemplate.postForEntity(managerUrl, requestEntity, JSONObject.class);
//        log.info("response body:{}", forEntity.getBody());
//        return forEntity.getBody().containsKey("error");
//    }
//
//
//    /**
//     * 执行流
//     *
//     * @param projectName
//     * @param flow
//     * @return
//     */
//    public boolean executeFlow(String projectName, String flow) {
//        HttpHeaders headers = new HttpHeaders();
//        //  封装参数，千万不要替换为Map与HashMap，否则参数无法传递
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(executorUrl)
//                .queryParam("session.id", getAzkabanSessionId())
//                .queryParam("project", projectName)
//                .queryParam("flow", flow)
//                .queryParam("ajax", "executeFlow");
//        HttpEntity<?> entity = new HttpEntity<>(headers);
//        String uri = builder.toUriString();
//        ResponseEntity<JSONObject> forEntity = restTemplate.exchange(uri, HttpMethod.GET, entity, JSONObject.class);
//        //{"project":"test","message":"Execution queued successfully with exec id 1197","flow":"basic","execid":1197}
//        log.info("response body:{}", forEntity.getBody());
//        String message = forEntity.getBody().getString("message");
//        if (StringUtils.isNotEmpty(message) && message.contains("successfully with exec")) {
//            return true;
//        }
//        return false;
//    }
//
//
//    /**
//     * flow设置调度
//     */
//    public boolean scheduleCronFlow(String projectName, String flow, String cronExpression) {
//        String url = String.format("%s/schedule", baseUrl);
//        //  封装参数，千万不要替换为Map与HashMap，否则参数无法传递
//        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
//        map.add("session.id", getAzkabanSessionId());
//        //见鬼了 web api上使用的是project作为参数传递
//        map.add("projectName", projectName);
//        map.add("flow", flow);
//        map.add("cronExpression", cronExpression);
//        map.add("ajax", "scheduleCronFlow");
//        ResponseEntity<JSONObject> forEntity = restTemplate.postForEntity(url, map, JSONObject.class);
//        log.info("response body:{}", forEntity.getBody());
//        String status = forEntity.getBody().getString("status");
//        return StringUtils.equals(status, "success");
//    }
//
//
//    /**
//     * 最新一条执行记录
//     *      * @param projectName
//     * @param flow
//     * @return
//     */
//    public FlowExecutionBean fetchFlowLatestExecution(String projectName, String flow) {
//        String sessionId = getAzkabanSessionId();
//        return fetchFlowLatestExecution(sessionId, projectName, flow);
//    }
//
//
//    /**
//     * 最新一条执行记录
//     *      * @param projectName
//     * @param flow
//     * @return
//     */
//    public FlowExecutionBean fetchFlowLatestExecution(String sessionId, String projectName, String flow) {
//        //先求出有多少条记录
//        int total = totalExecutionFlow(sessionId, projectName, flow);
//        log.info("projectName:{},flow:{}查询出总数:{}",projectName,flow,total);
//        if (total <= 0) {
//            return null;
//        }
//        HttpHeaders headers = new HttpHeaders();
//        //  封装参数，千万不要替换为Map与HashMap，否则参数无法传递
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(managerUrl)
//                .queryParam("session.id", sessionId)
//                .queryParam("project", projectName)
//                .queryParam("flow", flow)
//                .queryParam("start", total - 1)
//                .queryParam("length", 1)
//                .queryParam("ajax", "fetchFlowExecutions");
//        HttpEntity<?> entity = new HttpEntity<>(headers);
//        ResponseEntity<JSONObject> forEntity = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity, JSONObject.class);
//        log.info("response body:{}", forEntity.getBody());
//
//        JSONArray executions = forEntity.getBody().getJSONArray("executions");
//        if (executions != null && executions.size() > 0) {
//            JSONObject jsonObject = executions.getJSONObject(0);
//            //check
//            return JSON.parseObject(jsonObject.toString(), FlowExecutionBean.class);
//        }
//        return null;
//    }
//
//
//    /**
//     * 查询执行记录的总条数
//     *
//     * @param sessionId
//     * @param projectName
//     * @param flow
//     * @return
//     */
//    private int totalExecutionFlow(String sessionId, String projectName, String flow) {
//        HttpHeaders headers = new HttpHeaders();
//        //  封装参数，千万不要替换为Map与HashMap，否则参数无法传递
//        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
//        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(managerUrl)
//                .queryParam("session.id", sessionId)
//                .queryParam("project", projectName)
//                .queryParam("flow", flow)
//                .queryParam("start", 0)
//                .queryParam("length", 1)
//                .queryParam("ajax", "fetchFlowExecutions");
//        HttpEntity<?> entity = new HttpEntity<>(headers);
//        String uri = builder.toUriString();
//        ResponseEntity<JSONObject> forEntity = restTemplate.exchange(uri, HttpMethod.GET, entity, JSONObject.class);
//        log.info("response body:{}", forEntity.getBody());
//        Integer total = forEntity.getBody().getInteger("total");
//        return total == null ? 0 : total;
//    }


}
